#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )

package ${package}.biz.pay.alipay.sign;

import javax.crypto.Cipher;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class RSA {

    public static final String SIGN_ALGORITHMS = "SHA1WithRSA";


    public static String sign(String content, String privateKey, String input_charset) {
        try {
            PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
            KeyFactory keyf = KeyFactory.getInstance("RSA");
            PrivateKey priKey = keyf.generatePrivate(priPKCS8);

            java.security.Signature signature = java.security.Signature
                    .getInstance(SIGN_ALGORITHMS);

            signature.initSign(priKey);
            signature.update(content.getBytes(input_charset));

            byte[] signed = signature.sign();

            return Base64.encode(signed);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * RSA验签名检查
     *
     * @param content        待签名数据
     * @param sign           签名值
     * @param ali_public_key 支付宝公钥
     * @param input_charset  编码格式
     * @return 布尔值
     */
    public static boolean verify(String content, String sign, String ali_public_key, String input_charset) {
        try {
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            byte[] encodedKey = Base64.decode(ali_public_key);
            PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));


            java.security.Signature signature = java.security.Signature
                    .getInstance(SIGN_ALGORITHMS);

            signature.initVerify(pubKey);
            signature.update(content.getBytes(input_charset));

            boolean bverify = signature.verify(Base64.decode(sign));
            return bverify;

        } catch (Exception e) {
            e.printStackTrace();
        }

        return false;
    }

    /**
     * 解密
     *
     * @param content       密文
     * @param private_key   商户私钥
     * @param input_charset 编码格式
     * @return 解密后的字符串
     */
    public static String decrypt(String content, String private_key, String input_charset) {
        try {
            PrivateKey prikey = getPrivateKey(private_key);

            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, prikey);

            InputStream ins = new ByteArrayInputStream(Base64.decode(content));
            ByteArrayOutputStream writer = new ByteArrayOutputStream();
            //rsa解密的字节大小最多是128，将需要解密的内容，按128位拆开解密
            byte[] buf = new byte[128];
            int bufl;

            while ((bufl = ins.read(buf)) != -1) {
                byte[] block = null;

                if (buf.length == bufl) {
                    block = buf;
                } else {
                    block = new byte[bufl];
                    for (int i = 0; i < bufl; i++) {
                        block[i] = buf[i];
                    }
                }

                writer.write(cipher.doFinal(block));
            }

            return new String(writer.toByteArray(), input_charset);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "";
    }


    /**
     * 得到私钥
     *
     * @param key 密钥字符串（经过base64编码）
     * @throws Exception
     */
    public static PrivateKey getPrivateKey(String key) throws Exception {

        byte[] keyBytes;

        keyBytes = Base64.decode(key);

        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);

        KeyFactory keyFactory = KeyFactory.getInstance("RSA");

        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

        return privateKey;
    }

    public static void main(String[] args) {
        String content = "a=123";
        System.out.println(content);
        //String key="MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAN/mUmAr+L0NH4M/VPB+dWs9KiskeI2ghWW19dl64YZRn0YznPER+E9tLP7B0AvRm48VUzlqh0cM1eZkaYmvvr0AmJbptYA7SS1xz9Pq1Gy8PtC5MeNwYZQgAaEGycy4Oqu/Yzn8DyhfsIjLp+pOlHz4bECRiWDcMgSttrJHCNLxAgMBAAECgYAgJRAUkJuQgM7SaAhI0s8Gy2w/b2gDZVVhieM3CwZP424LhSN2FM9ij9kS5j55Q+mifDxLlPjBAZ3ACxB/3QR0Fz8VFymAeAOgIb/es0ZqrayjxHuSh6e8kuhDJFnaMvj0TxKCLjn+FvJs5PTccd3XHdMB7W8sCNPp/fw0OEsQ8QJBAP6KjIRpbo8xG0j33GVmwArL3BFLmYyiSU8hdlPgLiPX+XYNidfMcKxpZXallWwdKAGA0hYky9zawZKl85FoLx0CQQDhLtErroSAzbUgDi4fqtbj6UVu3MP3OI1Satg2+vaTNh9A9aoG7PoCAPkRUoCrcZ5hfW+4t427nx+TJ/mZ7AblAkEAtSiAV6D9+dV2WNlnN5gIZ+atKnYGw4ug5zumjo2H6STGO9no1/h93IdqmiXBEeAyX9eCLhZkLTxX9no7vqpKlQJBAK9awOKOTXrsNf8Xa82XQS5MKpixbB1puYuTznnKJxfuTppMdDJeejXzQgG+SJq5qMdsYgLrVYDk4ja7K4E0rw0CQQDOAUxl02h5fUbkrDmwkj77opDR9CEPYahXX2B9OXWqVvjwh1Jk518NNqrEujkXW/i52VfC5OHpCaW/cudW1XK7";
        String key = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAPN5/dyg9pTnZKlI4+8Pcv8InYp+zag1PoKsrYv/q7UH6ovuNnKnb1Kw9PTZ7TAjZaGdDNF/fT/6qGm355lQag+5gPlRkGD5x+f6YubdIpVmE2DOihSkJHhLLN6T8U00GVPKRFIiZ3wlJeX5pagrHTsB3AvWPoCXD3Jp3OJ5d+q/AgMBAAECgYAIeG4EhvUNKR+vZAHKB1eQ19PjRZYSDAgos6k1/acTnTrjs13hj0GoNs/O1OYTjqeyf6w6fZz15NqHEwbTpqCJ6iMaJYcD75dfKhXyWnauCV6n315kBNA2UWe5w4xCW/nmtN3IE8piGCAZokoTKZAjvcV+CPMWJZegSX6UAjWAgQJBAPr70Jos5net43CEynFlBjKq8MPPeC5DP+CNSOKx2dQwckSIS0VEplyT4j+cFrraluBaZURR0q4zyZYaSENgdvcCQQD4V8QKy4K/tY3OdWqFrG/Bs8A1JDlLL+oWaG+ZN5n5CASxPp2XseTFoRZSUpy1DfKDRtZaG31T/9PRMV3wwdB5AkEAzmsEaYi8E3oEMKpGBXTc4BcO5Txgz0un4XrRkwBK8uTVVd/yaAnJ+SH3VfF+EDdvFx3BY6sX5wXYqYb8H83aiQJAW990Kh4xx6RtyqRLfRpW2c0a3U4CWBtouVN3fbJBJwzdV4j3mif4n1hBvsDLMnvvbLtnDzy+N7Yb8XcW7rt02QJBAILiJsCqtlwuHf1aTNk/QpzT3zXCTnocz0NJ1iPyiUy8CrGeFoSRbqd2p1mX9tHiWxAUXKjcqa4DIq8WhquCD2M=";
        System.out.println(RSA.sign(content, key, "UTF-8"));

    }
}
